perm filename DCOPY.SAI[11,HE]2 blob sn#688189 filedate 1982-11-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "disk image copy program"			comment DCOPY.SAI
C00010 ENDMK
C⊗;
BEGIN "disk image copy program"			comment DCOPY.SAI;

DEFINE	CRLF="('15&'12)",
	! = "COMMENT ",
	TIL="STEP 1 UNTIL";

REQUIRE "11UTIL.HDR[11,SYS]" SOURCE_FILE;

DEFINE buflen = "'6000";

INTEGER bufadr,cyl,chan,brk,eof,cnt,flg,drv,sum,tmp,i,ck1,op;
SAFE INTEGER ARRAY foo[1:buflen];
STRING fname,s;

alinit;

chan ← getchan;
OPEN(chan,"DSK",'17,17,17,cnt,brk,eof);

WHILE TRUE DO BEGIN "loop"

  PRINT("Read from 11 or Write to 11 (R/W): "); 
  op ← IF (INCHWL LOR '40)="w" THEN TRUE ELSE FALSE;
  PRINT("Disk name on 10 (<cr> to exit): "); 
  fname ← inchwl; IF fname = NULL THEN CALL(0,"EXIT");
  PRINT("Drive number on 11: "); drv ← CVD(INCHWL);
  POKE('1002,drv);			! Tell 11 which drive to use;

  IF op THEN
    BEGIN				! Get ready to Write out;
    LOOKUP(chan,fname&".RSX",flg);
    IF flg THEN BEGIN PRINT("Can't find file - aborted"&crlf); CONTINUE END;
    PRINT("Type Y to confirm the write: "); IF (INCHWL LOR '40)≠"y" THEN CONTINUE;

    POKE('1004,2);			! Tell 11 to start writing;

    PRINT(crlf&"Starting write of: ",fname&".RSX",crlf&"   cyl:  ");

    SUM ← 0;
    FOR cyl ← 1 TIL 203 DO
      BEGIN
      ARRYIN(chan,foo[1],buflen);		! Read it from disk;
      FOR i ← 1 TIL buflen DO			! Compute the checksum;
	  Begin
	  TMP ← SUM + (SUM lsh 1);
	  SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
	  End;
      WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
      IF bufadr LAND 1 THEN
       BEGIN
       PRINT("Disk Error while writing cylinder ",cyl-2,crlf);
       CONTINUE "loop";
       END;
      POKEARRAY(bufadr,buflen,foo,TWRJ);		! Write the cylinder out;
      POKE('1000,0);			! Tell 11 we're done with buffer;
      IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
      END;
    WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Check 2nd last cyl was ok;
    IF bufadr LAND 1 THEN
      BEGIN
      PRINT("Disk Error while writing cylinder 202"&crlf);
      CONTINUE;
      END;
    POKE('1000,0);		      ! Tell 11 we're done with buffer;
    WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Wait til 11 writes last cyl;
    IF bufadr LAND 1 THEN
      BEGIN
      PRINT("Disk Error while writing cylinder 203"&crlf);
      CONTINUE;
      END;
    POKE('1000,0);		      ! Tell 11 we're done with buffer;
    CLOSE(chan);
    ck1 ← sum;
    PRINT(crlf&"Confirming the write" & crlf & "   cyl:  ");
    END

   ELSE		! Here for read from 11;
    BEGIN
    ENTER(chan,fname&".RSX",flg);
    POKE('1004,1);					! Tell 11 to start reading;

    PRINT(crlf&"Starting read of: ",fname,".RSX",crlf&"   cyl:  ");

    SUM ← 0;
    FOR cyl ← 1 TIL 203 DO
      BEGIN
      WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
      IF bufadr LAND 1 THEN
       BEGIN
       PRINT("Disk Error while reading cylinder ",cyl-1,crlf);
       CONTINUE "loop";
       END;
      PEEKARRAY(bufadr,buflen,foo,TWRJ);		! Read the cylinder in;
      POKE('1000,0);			! Tell 11 we're done with buffer;
      ARRYOUT(chan,foo[1],buflen);			! Store it to disk;
      FOR i ← 1 TIL buflen DO		! Compute the checksum;
	  Begin
	  TMP ← SUM + (SUM lsh 1);
	  SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
	  End;
      IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
      END;
    CLOSE(chan);
    ck1 ← sum;
    PRINT(crlf&"Confirming the read" & crlf & "   cyl:  ");
    END;

  POKE('1004,1);			! Tell 11 to start re-reading;

  SUM ← 0;
  print("Verifying copy...",crlf);
  FOR cyl ← 1 TIL 203 DO
    BEGIN
    WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
    IF bufadr LAND 1 THEN
     BEGIN
     PRINT("Disk Error while reading cylinder ",cyl,crlf);
     CONTINUE "loop";
     END;
    PEEKARRAY(bufadr,buflen,foo,TWRJ);		! Read the cylinder in;
    POKE('1000,0);			! Tell 11 we're done with buffer;
    FOR i ← 1 TIL buflen DO		! Compute the checksum;
	Begin
	TMP ← SUM + (SUM lsh 1);
	SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
	End;
    IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
    END;

  S ← "";
  tmp ← abs(ck1);
  While tmp neq 0 Do
    Begin
    S ← S & ("A" + (tmp mod 26));
    tmp ← tmp div 26;
    End;
  IF ck1 = sum THEN PRINT(crlf & "Checksums match = ",S, " - Copy complete" & crlf)
   ELSE
      BEGIN
      PRINT(crlf & "Checksums don't match - Error" & crlf);
      S ← S & "	 ";
      SUM ← abs(SUM);
      While SUM neq 0 Do
	Begin
	S ← S & ("A" + (SUM mod 26));
	SUM ← SUM div 26;
	End;
      PRINT("  The two checksums: ",S,crlf);
      END;
  END;
END;